 %�и�����Ŵ��㷨
%m_no���ְ�
%���뷽ʽ��chrome=[�ְ��и�˳�򣬸ְ屻���õĻ���]
clc
clear all

N=100;     %��Ⱥ��ģ(ȡż��)
load Nomal_s.mat
load Setdown_time.mat
load Setup_time_1.mat
load Machine.mat
load Due_date.mat
load Speed.mat
V=[1.5  2  2.5];   
job_no=[20 25 40 60 100];
N_temp=size(Nomal_s,1);
for in=1:5
for im=1:N_temp
    tic
    LENGTHPlate=Nomal_s(im,1);%��ĵ��и��
    Machine_single=Machine(im,1);   %%����ѡ�����
    m_no=size(LENGTHPlate,2); %�ְ�����
    M=m_no;      %�Ŵ�������������
    temp1=1:m_no;
    temp2=Machine_single(:,1:3)';
    CUTMachineDis=[temp1;temp2];
    Setup=Setup_time_1{im,1};   %%��ĵ�׼��ʱ��
    Setdown=Setdown_time{im,1};  %%��ĵ���ʰʱ��
    DELIVERPlate=Due_date{im,1};%��ĵĽ�����
    availableMachine=[2 1 1];%ÿ�����ͻ�����̨��
    Vcut= V;%�и�����и��ٶ�
    n_no=m_no;                  %�ְ��Ӧ�Ļ����ֲ���m_no==n_no��
    BestManufactureTime = zeros(3,m_no);%�������ʱ��ֲ��Լ������Ļ����ĵڼ�̨��Ϣ��������ͼ

%% ���������ʼ��Ⱥ
harmony=zeros(N,m_no+n_no);  %������Ⱥ
for k=1:N
    cutSeqence=randperm(m_no);
    machine=zeros(1,n_no);
    %�����и����
    for i=1:m_no
        index=find(cutSeqence(i)==CUTMachineDis(1,:));    %%�ҳ���Ӧ�Ĺ���
        machineAvailable=CUTMachineDis(2:end,index); %%�ҳ���Ӧ���������õĻ��� ����
        temp=ceil((size(CUTMachineDis,1)-1)*rand);  %%���ѡ��һ̨����
        machine(i) = CUTMachineDis(temp+1,index);  %%��ʹ�õĻ������и�ֵ

        while(machine(i)==0)                     %%���ѡ��Ļ������ܱ�ʹ��  Ҳ����0����ѭ������ѡ��
            temp=ceil((size(CUTMachineDis,1)-1)*rand);
            machine(i) = CUTMachineDis(temp+1,index);
        end
    end
    harmony(k,:)=[cutSeqence machine];
end
%% ��Ŀ�꺯��ֵ����
        n=100;     
        Aut_no=30;%�ⲿ����⣬�洢��Ӣ��
        mubiao=2;%Ŀ�����
        long=size(harmony,2);
        Out_Memory=zeros(1,long+mubiao+2);%�ⲿ����⣬��ŷ���longȾɫ�峤�ȡ�Ŀ��ֵ2��Ŀ��ֵ���ȼ�����ֵ����ӵ�����루��ֵ��
     make_fit=[];
     tardi_fit=[];
%%  ���۳�ʼ��Ⱥ
for k=1:N
    chrome=harmony(k,:);
     [makespan,tardiness,setime,manufacturetime] = ManufactureCost(chrome,m_no,DELIVERPlate,availableMachine,Vcut,LENGTHPlate,Setup,Setdown);    
     make_fit(k,:)=makespan;%(����깤ʱ��)
     tardi_fit(k,:)=tardiness;%������ʱ�䣩
end    
%% ���з�֧�����򣬼���ӵ������
Classy=zeros(n,1);       %%��Ⱥ��ģ����n
x0=[harmony make_fit tardi_fit Classy];   %%Ⱦɫ�� 2��Ŀ��  ���༶��
f = non_domination_sort_mod(x0, mubiao, long);   %%  û���ظ�Ⱦɫ���Ⱦɫ�����飬Ŀ�������Ⱦɫ�峤��
f_temp=f(:,1:(size(f,2)-4)); 
%% ����
X1_no=find(f(:,long+mubiao+1)==1);%ȡ����һ�����и���,X1�а���ӵ������ֵ����������һ��
X1=f(X1_no,:);
X0=unique(X1,'rows'); %ɸѡ���߳���ͬ���塢��֧����塢ӵ������С�ĸ��壬��֤�ⲿ������ģ
Out_Memory_temp_num=size(X0,1);  
counter=0; %���õ���������
Select_no=100; %ѡ��ĸ���
while counter<M  %ֹͣ����Ϊ�ﵽ����������
    expectation_muta=[];
%% ѡ��
    harmony=f_temp;
%% ����
    CrossChromes=Crossoperation(harmony,Select_no,m_no,n_no,CUTMachineDis);
    
%% ����
    [MutationChrome,Mutation_no]=Mutation(CrossChromes,Select_no,m_no,n_no,CUTMachineDis,Out_Memory_temp_num);
    
    %���²������Ӵ�����ԭ��Ⱥ���γ���һ����Ⱥ
x13=[harmony;CrossChromes;MutationChrome];
x12=unique(x13,'rows');
if size(x12,1)<Select_no
    temp=Select_no-size(x12,1);
    harmony=zeros(temp,m_no+n_no);  %������Ⱥ
make_fit=[]; %������Ⱥ��ÿ���и������Ӧ��ֵ
tardi_fit=[]; %������Ⱥ��ÿ���и������Ӧ��ֵ
f5=[];
for k=1:temp
    cutSeqence=randperm(m_no);
    machine=zeros(1,n_no);
    %�����и����
    for i=1:m_no
        index=find(cutSeqence(i)==CUTMachineDis(1,:));    %%�ҳ���Ӧ�Ĺ���
        machineAvailable=CUTMachineDis(2:end,index); %%�ҳ���Ӧ���������õĻ��� ����
        temp=ceil((size(CUTMachineDis,1)-1)*rand);  %%���ѡ��һ̨����
        machine(i) = CUTMachineDis(temp+1,index);  %%��ʹ�õĻ������и�ֵ
        while(machine(i)==0)                     %%���ѡ��Ļ������ܱ�ʹ��  Ҳ����0����ѭ������ѡ��
            temp=ceil((size(CUTMachineDis,1)-1)*rand);
            machine(i) = CUTMachineDis(temp+1,index);
        end
    end
    f5(k,:)=[cutSeqence machine];
end
x12=[x12;f5];
end
    for k=1:size(x12,1)
        chrome=x12(k,:);
        [makespan,tardiness,setime,manufacturetime] = ManufactureCost(chrome,m_no,DELIVERPlate,availableMachine,Vcut,LENGTHPlate,Setup,Setdown);
        expectation_muta(k,1)=makespan;
        expectation_muta(k,2)=tardiness;
    end       
%% �ϲ���Ⱥѡ������Ⱥ
Classy=zeros(size(x12,1),1);

x2=[x12 expectation_muta Classy];%����Ⱥ
%�ϲ�������Ⱥ   Ⱦɫ��������x1+x2

f1= non_domination_sort_mod(x2, mubiao, long);   %%��ռ������

%% �ҳ�����select_no �������������
f2=sortrows(f1,[(size(f1,2)-1) -size(f1,2)]);
f_100=f2(1:100,:);

%% ȡ����һ�����и���,X1�а���ӵ������ֵ����������һ��
X1_no=find(f_100(:,long+mubiao+1)==1);%ȡ����һ�����и���,X1�а���ӵ������ֵ����������һ��
X1=f_100(X1_no,:);
X0=unique(X1,'rows'); %ɸѡ���߳���ͬ���塢��֧����塢ӵ������С�ĸ��壬��֤�ⲿ������ģ
X2=sortrows(X0,[(size(X0,2)-1) -size(X0,2)]);
Out_Memory_temp_num=size(X2,1);  
if Out_Memory_temp_num>Aut_no
    Out_Memory=X2(1:Aut_no,:); 
else
    Out_Memory=X2;
end

f_temp=f_100(:,1:size(f_100,2)-4);
% f_temp(size(Out_Memory,1)+1:size(f,1),1:size(Out_Memory_1,2)-2)=f(size(Out_Memory,1)+1:size(f,1),1:size(f,2)-4);
counter=counter+1;  
end   
Memory_ii{in,im}=Out_Memory(:,1:size(Out_Memory,2)-2)

time_ii(in,im)=toc   
end
end
number=size(Out_Memory,1);
for i=1:number
chrom1=Out_Memory(i,1:size(Out_Memory,2)-4)
     [makespan,tardiness,setime,manufacturetime] = ManufactureCost(chrom1,m_no,DELIVERPlate,availableMachine,Vcut,LENGTHPlate,Setup,Setdown)
end

save Memory_ii Memory_ii
save time_ii time_ii


